//引用库
var $$=mdui.JQ;
//调用lua函数
function callApp(name, backName, other) {
  console.log("jwyhhsk" + "【nameStart】" + name + "【nameEnd】" + "【backNameStart】" + backName + "【backNameEnd】" + "【otherStart】" + other + "【otherEnd】");
}
//初始化quasar
Quasar.lang.set(Quasar.lang.zhHans);
//初始化vue.js
var app=new Vue(
  {
    el: '#q-app',
    data: {
      animateInStyle:"bounceIn",
      app_name: "app_name",
      app_version: 'app_version',
      bookshelf:[
        {
          "chapter_code":"无",
          "book_code":"90183",
          "chapter_name":"最近阅读:模板书籍",
          "book_title":"模板书籍",
          "loading":true,
          "id":0
        }
      ],
      charts:[
        {"chart_name":"今日热榜","chart_code":"today"},{"chart_name":"本周热榜","chart_code":"week"},{"chart_name":"本月热榜","chart_code":"month"},{"chart_name":"总热榜","chart_code":"all"}
      ],
      config:{},
      dark:false,
      defaultTheme:{
        浅色:"默认",
        深色:"默认"
      },
      down:function() {},
      drawer:undefined,
      enableDrawer:true,
      htmlVer:"alpha6",
      isBookshelfNull:true,
      isEAPP:undefined,
      lastBooks:[
        {"book_code":"88515","book_title":"重生成O后嫁给帝国元帅","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88514","book_title":"云时雨","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88513","book_title":"和影帝离婚后我爆红了[穿书]","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88512","book_title":"崽崽的储备粮","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88511","book_title":"逢祝","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88510","book_title":"似语(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88509","book_title":"蛇兔一窝(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88508","book_title":"我，反派，贼深情［快穿］","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88507","book_title":"Binding love","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88506","book_title":"今天我离婚了吗","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88505","book_title":"每天都在作死边缘试探","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88504","book_title":"回到末世之前做仓鼠","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88503","book_title":"我是花瓶我乐意[娱乐圈]","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88502","book_title":"公子有疾无玉不医","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88501","book_title":"温柔控制","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88500","book_title":"重生八五最强医神","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88499","book_title":"大神家那位又在闹海","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88498","book_title":"女配升级啦[穿书]","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88497","book_title":"重生九零之厨神甜妻","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88496","book_title":"夫人虐渣要趁早","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88495","book_title":"我和爱豆上了恋爱头条[娱乐圈]","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88494","book_title":"和薄少撒个娇","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88493","book_title":"救命含糖量过高","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88492","book_title":"她家渣爷又犯病了","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88491","book_title":"冷酷战神夺命仙妻/冷酷战神独宠仙妻","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88490","book_title":"明宫杨柳依依","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88489","book_title":"大明要亡","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88488","book_title":"皇叔颜色好","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88487","book_title":"九千岁家的小女儿","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88486","book_title":"我爱上了他","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88485","book_title":"小女子能文能武","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88484","book_title":"重生悍妻要逆袭","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88483","book_title":"女妃谋：权御天下","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88482","book_title":"外星人的闺秀日常","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88481","book_title":"情难自控/强占","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88480","book_title":"我是星际第一大可爱","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88479","book_title":"你罩我吧","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88478","book_title":"抱窝(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88477","book_title":"空臀套白狼(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88476","book_title":"姜可(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88475","book_title":"抱抱兔兔(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88474","book_title":"妻色撩人(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88473","book_title":"怪癖(H)","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88472","book_title":"我要温柔[快穿]","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88471","book_title":"穿成被退婚的娇弱omega","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88470","book_title":"美食拯救娱乐圈","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88469","book_title":"嫁给渣攻的杀马特爹后","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88468","book_title":"这有一只天然呆","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88467","book_title":"书中自有颜如玉","sort_name":"类型：耽美","loading":true,"synopsis":""},{"book_code":"88466","book_title":"史上最弱Alpha","sort_name":"类型：耽美","loading":true,"synopsis":""}
      ],
      page:"main",
      pages:{
        main:false,
        welcome:false,
        passwd:true,
        read:false
      },
      passwd:{
        可见:true,
        密码:"",
        验证消息:"",
        验证:false,
        加载:false
      },
      read:{
        first:true,
        nav:false,
        nextChapter_code:"未开始阅读",
        lastChapter_code:"未开始阅读",
        book_code:"未开始阅读",
        type:"first",
        pageToRemove:0,
        pageToJump:1,
        参数:{},
        testPage:{
          hasTitle:true,
          book_title:"书籍名称",
          chapter_name:"章节名称",
          inner:["段落"]
        },
        realPages:[
          {
            hasTitle:true,
            book_title:"书籍名称",
            chapter_name:"章节名称",
            inner:["段落"]
          }
        ]
      },
      sorts:[
        {"sort_name":"耽美","sort_code":"9"},{"sort_name":"辣文","sort_code":"11"},{"sort_name":"言情","sort_code":"3"},{"sort_name":"百合","sort_code":"17"}
      ],
      tab:"bookshelf",
      tags:[
        {"tag_name":"快穿","tag_code":"kc"},{"tag_name":"美攻","tag_code":"mg"},{"tag_name":"肉文","tag_code":"rw"},{"tag_name":"年下","tag_code":"nx"},{"tag_name":"年上","tag_code":"ns"},{"tag_name":"生子","tag_code":"sz"},{"tag_name":"人兽","tag_code":"rs"},{"tag_name":"强强","tag_code":"qq"},{"tag_name":"穿越","tag_code":"cy"},{"tag_name":"双性","tag_code":"sx"},{"tag_name":"强受","tag_code":"qs"},{"tag_name":"ABO","tag_code":"abo"},{"tag_name":"重生","tag_code":"cs"},{"tag_name":"HP","tag_code":"hp"},{"tag_name":"虐文","tag_code":"nw"},{"tag_name":"温馨","tag_code":"wx"},{"tag_name":"NP","tag_code":"np"},{"tag_name":"父子","tag_code":"fz"},{"tag_name":"兄弟","tag_code":"xd"},{"tag_name":"萌文","tag_code":"mw"},{"tag_name":"BE","tag_code":"be"},{"tag_name":"末世","tag_code":"ms"},{"tag_name":"人鱼","tag_code":"ry"},{"tag_name":"师生","tag_code":"ss"},{"tag_name":"网游","tag_code":"wy"},{"tag_name":"娱乐圈","tag_code":"ylq"},{"tag_name":"高干","tag_code":"gg"},{"tag_name":"金手指","tag_code":"jsz"},{"tag_name":"反攻","tag_code":"fg"},{"tag_name":"诱受","tag_code":"ys"},{"tag_name":"种田","tag_code":"zt"},{"tag_name":"SM调教","tag_code":"sm"}
      ],
      title:"title",
      toolbar:"search",
      transitionStyle:"slide-right",
      welcome:{
        step: 1,
        done1: false,
        done2: false,
        done3: false,
        code:"",
        progress1:false,
        progress2:false,
        progress3:false,
        alert:false,
        域码验证:false,
        域码验证消息:"",
        账号验证:false,
        账号验证消息:"",
        密码验证:false,
        密码验证消息:"",
        重复密码验证:false,
        重复密码验证消息:"",
        验证码验证:false,
        验证码验证消息:"",
        启动密码验证:false,
        启动密码验证消息:"",
        账号:"",
        密码:"",
        重复密码:"",
        验证码:"",
        启动密码:"",
        是否登录:true,
        是否注册:false,
        卡片状态:"登录",
        密码可见:true,
        重复密码可见:true,
        启动密码可见:true,
        验证码图片:"img/verImgLoading.svg"
      },
      滑动阅读:[
        {
          chapter_name:"章节标题",
          inner:["内容"],
          nextChapter_code:"无",
          lastChapter_code:"无"
        }
      ],
      刷新书架UI:0,
      阅读:{
        验证码:false,
        验证码图片:"img/verImgLoading.svg",
        验证码验证:false,
        验证码验证消息:"",
        验证码内容:"",
        章节代码加载:false
      }
    },
    methods: {
      refresh: function() {},
      加载书籍简介: function(id,book_code) {
        app.$set(app.bookshelf[id],'loading',true);
        //setTimeout(callApp,1000,"书籍简介", "",JSON.stringify([book_code]));
        请求({
          方法:"POST",//string，GET或POST
          地址:app.config.域码+"novel/"+book_code+".html",//string，链接地址（绝对或相对）
          异步:true,//Boolean，是否启用异步
          数据:"",//string，向服务器发送的数据（仅用于post请求）
          发送前:function(xhr,参数) {
            //function，在配置完成后，发送请求前调用
          },
          完成后:function(是否成功,状态码,内容,xhr) {
            //function，在请求完成后调用
            app.域码验证(xhr.responseURL);
            app.登录验证(xhr.responseURL);
            var 书籍简介={};
            书籍简介.book_code=book_code;
            书籍简介.writer=内容.match(/(?<=作者：<h2>)(.+)(?=<\/h2>)/gi)[0];
            书籍简介.time=内容.match(/(?<=更新时间：<time>)(.+)(?=<\/time>)/gi)[0];
            书籍简介.synopsis=secret(内容.match(/(?<=简介([\s\S]+)secret\(\").+?(?=\",)/gi)[0], 内容.match(/(?<=简介([\s\S]+)secret\(\"([\s\S]+)\", \").+?(?=\",)/gi)[0], s2b(内容.match(/(?<=简介([\s\S]+)secret\(\"([\s\S]+)\", \"([\s\S]+)\", ).+?(?=\))/gi)[0]));
            请求({
              方法:"POST",//string，GET或POST
              地址:app.config.域码+内容.match(/tool\/displayGrade\/([^,]*)\//gi)[0],//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"",//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                app.登录验证(xhr.responseURL);
                var res=JSON.parse(内容);
                书籍简介.starPeople=Number(res[0].total)+Number(res[1].total)+Number(res[2].total);
                书籍简介.star=Math.round((Number(res[0].total)*0+Number(res[1].total)*5+Number(res[2].total)*10)*100/书籍简介.starPeople)/100;
                if (res[3].isGrade==0) {
                  书籍简介.myStar="未评分";
                  书籍简介.myStarState=false;
                } else {
                  var starName=["不好看(0分)","还可以(5分)","很不错(10分)"];
                  书籍简介.myStar=starName[res[3].vote];
                  书籍简介.myStarState=true;
                }
                for (var index in app.bookshelf) {
                  if (app.bookshelf.hasOwnProperty(index)) {
                    if (typeof app.bookshelf[index]=="object") {
                      if (app.bookshelf[index].book_code==书籍简介.book_code) {
                        app.$set(app.bookshelf[index],'info',书籍简介);
                        app.$set(app.bookshelf[index],'loading',false);
                      }
                    }
                  }
                }
              },
              超时:function() {
                //function，在请求超时时调用
                app.$q.notify({
                  message: '连接超时，请检查网络连接',
                  icon: 'error',
                  color:"negative"
                });
              }
            });
          },
          超时:function() {
            //function，在请求超时时调用
            app.$q.notify({
              message: '连接超时，请检查网络连接',
              icon: 'error',
              color:"negative"
            });
          }
        });
      },
      transition: function() {
        var transitionList=[
          "slide-right",
          "slide-left",
          "slide-up",
          "slide-down",
          "fade",
          "scale",
          "rotate",
          "flip-right",
          "flip-left",
          "flip-up",
          "flip-down",
          "jump-right",
          "jump-left",
          "jump-up",
          "jump-down"
        ];
        var transitionNum=Math.floor(Math.random()*(transitionList.length-0))+0;
        this.transitionStyle=transitionList[transitionNum];
      },
      animateIn: function() {
        var animateInList=[
          "bounceIn",
          "bounceInDown",
          "bounceInLeft",
          "bounceInRight",
          "bounceInUp",
          "fadeIn",
          "fadeInDown",
          "fadeInDownBig",
          "fadeInLeft",
          "fadeInLeftBig",
          "fadeInRight",
          "fadeInRightBig",
          "fadeInUp",
          "fadeInUpBig",
          "flipInX",
          "flipInY",
          "lightSpeedIn",
          "rotateIn",
          "rotateInDownLeft",
          "rotateInDownRight",
          "rotateInUpLeft",
          "rotateInUpRight",
          "jackInTheBox",
          "rollIn",
          "zoomIn",
          "zoomInDown",
          "zoomInLeft",
          "zoomInRight",
          "zoomInUp",
          "slideInDown",
          "slideInLeft",
          "slideInRight",
          "slideInUp"
        ];
        var animateInNum=Math.floor(Math.random()*(animateInList.length-0))+0;
        return "animated " + animateInList[animateInNum]
      },
      animateOut: function() {
        var animateOutList=[
          "bounceOut",
          "bounceOutDown",
          "bounceOutLeft",
          "bounceOutRight",
          "bounceOutUp",
          "fadeOut",
          "fadeOutDown",
          "fadeOutDownBig",
          "fadeOutLeft",
          "fadeOutLeftBig",
          "fadeOutRight",
          "fadeOutRightBig",
          "fadeOutUp",
          "fadeOutUpBig",
          "flipOutX",
          "flipOutY",
          "lightSpeedOut",
          "rotateOut",
          "rotateOutDownLeft",
          "rotateOutDownRight",
          "rotateOutUpLeft",
          "rotateOutUpRight",
          "hinge",
          "rollOut",
          "zoomOut",
          "zoomOutDown",
          "zoomOutLeft",
          "zoomOutRight",
          "zoomOutUp",
          "slideOutDown",
          "slideOutLeft",
          "slideOutRight",
          "slideOutUp"
        ];
        var animateOutNum=Math.floor(Math.random()*(animateOutList.length-0))+0;
        return "animated " + animateOutList[animateOutNum]
      },
      startStepper:function() {
        this.stepDom=setInterval(
          function(){
            try {
              document.getElementsByClassName("wel_stepper")[0].style.paddingBottom=document.getElementsByClassName("wel_stepper")[0].childNodes[0].offsetHeight+"px";
            }
            catch(err) {
              if (this.page!="welcome") {
                clearInterval(this.stepDom);
              }
            }
          }, 500
        );
      },
      结束刷新书架动画: function() {},
      刷新书架: function(down) {
        return new Promise(resolve => {
          setTimeout(() => {
            请求({
              方法:"POST",//string，GET或POST
              地址:app.config.域码+"bookcase/",//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"",//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                app.登录验证(xhr.responseURL);
                var books=内容.match(/<table class='bookone' id=\d+>[\s\S]+?<\/table>/gi);
                var 书架内容=[];
                var 序号=0;
                for (i in books) {
                  书架内容[序号]={};
                  var 书签=books[i].match(/(?<='case_shuqian'>).+?(?=<\/td>)/gi)[0];
                  if (书签=="书签：无书签") {
                    书架内容[序号].chapter_code="无";
                    书架内容[序号].chapter_name="还未开始阅读";
                  } else {
                    书架内容[序号].chapter_code=书签.match(/(?<=\/)\d+?(?=.html)/gi)[0];
                    书架内容[序号].chapter_name="最近阅读:".concat(书签.match(/(?<=>).+?(?=<)/gi)[0]);
                  }
                  书架内容[序号].book_code=books[i].match(/(?<=id=)\d+?(?=>)/gi)[0];
                  书架内容[序号].book_title=books[i].match(/(?<=case_name.+?html\'>).+?(?=<)/gi)[0];
                  书架内容[序号].loading=true;
                  书架内容[序号].id=序号;
                  序号++;
                }
                if (书架内容.length==0) {
                  app.isBookshelfNull=true;
                } else {
                  //console.log(参数);
                  app.isBookshelfNull=false;
                  app.bookshelf.splice(0,app.bookshelf.length);
                  for (var index in 书架内容) {
                    if (书架内容.hasOwnProperty(index)) {
                      if (typeof 书架内容[index]=="object") {
                        app.bookshelf.push(书架内容[index]);
                      }
                    }
                  }
                }
                resolve();
              },
              超时:function() {
                //function，在请求超时时调用
                app.$q.notify({
                  message: '连接超时，请检查网络连接',
                  icon: 'error',
                  color:"negative"
                });
                resolve();
              }
            });
          }, 200);
        });
      },
      刷新发现: function(down) {
        return new Promise(resolve => {
          setTimeout(() => {
            setTimeout(callApp,1000,"刷新发现", "","{}");
            app.$set(app,'结束刷新发现动画',resolve);
            //resolve();
          }, 200);
        });
      },
      结束加载更多发现动画: function() {},
      加载更多发现: function(down) {
        return new Promise(resolve => {
          setTimeout(() => {
            setTimeout(callApp,1000,"加载更多发现", "","{}");
            app.$set(app,'结束加载更多发现动画',resolve);
            //resolve();
          }, 200);
        });
      },
      欢迎页验证域码:function() {
        if (this.welcome.code!="") {
          this.welcome.域码验证=false;
          this.welcome.progress1=true;
          //callApp("欢迎页验证域码","",JSON.stringify(["欢迎页验证域码回调",解密(this.welcome.code)]));
          function 域码错误(消息) {
            app.welcome.progress1=false;
            app.welcome.域码验证消息=消息;//'连接失败，请检查网络连接及所输入的域码是否正确'
            app.welcome.域码验证=true;
          }
          try {
            this.config.域码=解密(this.welcome.code);
            if (!this.config.域码.match(/^http(s)?:\/\//gi)) {
              this.config.域码="http://"+this.config.域码;
            }
            if (!this.config.域码.match(/\/$/gi)) {
              this.config.域码=this.config.域码+"/";
            }
            请求({
              方法:"POST",//string，GET或POST
              地址:this.config.域码,//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"",//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                if (是否成功) {
                  app.$q.notify({
                    message: '连接成功',
                    icon: 'check_circle',
                    color:"primary"
                  })
                  setTimeout(function() {
                    app.welcome.progress1=false;
                    app.welcome.done1 = true;
                    app.welcome.step = 2;
                    app.welcome.alert=true;
                    app.欢迎页验证码()
                  },2000)
                } else {
                  域码错误('无法连接，请检查网络及输入的域码是否正确。E:'+状态码)
                }
              },
              超时:function() {
                //function，在请求超时时调用
              }
            });
          } catch (e) {
            域码错误('无法解密域码，请检查输入的域码是否正确。Err：'+e)
          }
        } else {
          this.welcome.域码验证消息='域码不能为空';
          this.welcome.域码验证=true;
        }
      },
      欢迎页动画回调:function() {
        if (this.welcome.卡片状态=="登录") {
          this.welcome.是否注册=true;
          this.welcome.卡片状态="注册";
        } else {
          this.welcome.是否登录=true;
          this.welcome.卡片状态="登录";
        }
      },
      欢迎页切换注册:function() {
        this.welcome.是否登录=false;
        this.welcome.账号验证=false;
        this.welcome.密码验证=false;
        this.welcome.重复密码验证=false;
        this.welcome.验证码验证=false;
      },
      欢迎页切换登录:function() {
        this.welcome.是否注册=false;
        this.welcome.账号验证=false;
        this.welcome.密码验证=false;
        this.welcome.重复密码验证=false;
        this.welcome.验证码验证=false;
      },
      欢迎页账号:function() {
        if (this.welcome.是否登录==true) {
          var error=false;
          this.welcome.账号验证=false;
          this.welcome.密码验证=false;
          this.welcome.验证码验证=false;
          if (this.welcome.账号=="") {
            error=true;
            this.welcome.账号验证消息="账号不能为空";
            this.welcome.账号验证=true;
          }
          if (this.welcome.密码=="") {
            error=true;
            this.welcome.密码验证消息="密码不能为空";
            this.welcome.密码验证=true;
          }
          if (this.welcome.验证码=="") {
            error=true;
            this.welcome.验证码验证消息="验证码不能为空";
            this.welcome.验证码验证=true;
          }
          if (error!=true) {
            this.welcome.progress2=true;
            //callApp("欢迎页账号","",JSON.stringify(["欢迎页账号回调","登录",this.welcome.账号,this.welcome.密码,this.welcome.验证码]));
            function 退出登录() {
              请求({
                方法:"POST",//string，GET或POST
                地址:app.config.域码+"member/logout/?t=1",//string，链接地址（绝对或相对）
                异步:true,//Boolean，是否启用异步
                数据:"",//string，向服务器发送的数据（仅用于post请求）
                发送前:function(xhr,参数) {
                  //function，在配置完成后，发送请求前调用
                },
                完成后:function(是否成功,状态码,内容,xhr) {
                  //function，在请求完成后调用
                  if (是否成功) {
                    获取验证()
                    app.域码验证(xhr.responseURL);
                  } else {
                    app.欢迎页验证码()
                    var 错误提示='无法连接，请检查网络及之前输入的域码是否正确。E:'+状态码;
                    app.welcome.progress2=false;
                    app.welcome.账号验证消息=错误提示;
                    app.welcome.账号验证=true;
                    app.welcome.密码验证消息=错误提示;
                    app.welcome.密码验证=true;
                    app.welcome.重复密码验证消息=错误提示;
                    app.welcome.重复密码验证=true;
                    app.welcome.验证码验证消息=错误提示;
                    app.welcome.验证码验证=true;
                  }
                },
                超时:function() {
                  //function，在请求超时时调用
                }
              });
            }
            function 获取验证() {
              请求({
                方法:"GET",//string，GET或POST
                地址:app.config.域码+"member/login/",//string，链接地址（绝对或相对）
                异步:true,//Boolean，是否启用异步
                数据:"",//string，向服务器发送的数据（仅用于post请求）
                发送前:function(xhr,参数) {
                  //function，在配置完成后，发送请求前调用
                },
                完成后:function(是否成功,状态码,内容,xhr) {
                  //function，在请求完成后调用
                  if (是否成功) {
                    app.域码验证(xhr.responseURL);
                    if (内容.match(/<form([\s\S]*)<\/form>/gi)) {
                      //未登录，拼接获取到的验证信息
                      var prev=内容.match(/<form([\s\S]*)<\/form>/gi)[0].match(/<input type="hidden"([^>]*)>/gi);
                      var prev_r="";
                      for (var index in prev) {
                        if (prev.hasOwnProperty(index)) {
                          var name=prev[index].match(/name="([^"]*)"/gi)[0].replace("name=\"","").replace("\"","");
                          var value=prev[index].match(/value="([^"]*)"/gi)[0].replace("value=\"","").replace("\"","");
                          prev_r=prev_r+"&"+name+"="+value;
                        }
                      }
                      登录请求(prev_r);
                    } else {
                      //已登录
                      app.欢迎页验证码()
                      var 错误提示="登录失败，请尝试重新登录，如多次出现此消息请联系开发者。E:"+内容.match(/<p class="(error|success)">(.+)<\/p>/gi)[0].replace(/<.?p.?(class=".+")?>/gi,"");
                      app.welcome.progress2=false;
                      app.welcome.账号验证消息=错误提示;
                      app.welcome.账号验证=true;
                      app.welcome.密码验证消息=错误提示;
                      app.welcome.密码验证=true;
                      app.welcome.重复密码验证消息=错误提示;
                      app.welcome.重复密码验证=true;
                      app.welcome.验证码验证消息=错误提示;
                      app.welcome.验证码验证=true;
                    }
                  } else {
                    app.欢迎页验证码()
                    var 错误提示='无法连接，请检查网络及之前输入的域码是否正确。E:'+状态码;
                    app.welcome.progress2=false;
                    app.welcome.账号验证消息=错误提示;
                    app.welcome.账号验证=true;
                    app.welcome.密码验证消息=错误提示;
                    app.welcome.密码验证=true;
                    app.welcome.重复密码验证消息=错误提示;
                    app.welcome.重复密码验证=true;
                    app.welcome.验证码验证消息=错误提示;
                    app.welcome.验证码验证=true;
                  }
                },
                超时:function() {
                  //function，在请求超时时调用
                }
              })
            }
            function 登录请求(prev_r) {
              请求({
                方法:"POST",//string，GET或POST
                地址:app.config.域码+"member/login/",//string，链接地址（绝对或相对）
                异步:true,//Boolean，是否启用异步
                数据:"user="+app.welcome.账号+"&pass="+app.welcome.密码+"&imgcode="+app.welcome.验证码+prev_r,//string，向服务器发送的数据（仅用于post请求）
                发送前:function(xhr,参数) {
                  //function，在配置完成后，发送请求前调用
                },
                完成后:function(是否成功,状态码,内容,xhr) {
                  //function，在请求完成后调用
                  if (是否成功) {
                    app.域码验证(xhr.responseURL);
                    if (内容.match(/<p class="(error|success)">(.+)<\/p>/gi)[0].match("success")) {
                      //登陆成功
                      app.config.小屋账号=app.welcome.账号;
                      app.config.小屋密码=app.welcome.密码;
                      app.$q.notify({
                        message: app.welcome.卡片状态+'成功',
                        icon: 'check_circle',
                        color:"autoLight"
                      })
                      setTimeout(function() {
                        app.welcome.progress2=false;
                        app.welcome.done2 = true;
                        app.welcome.step = 3;
                      },2000)
                    } else {
                      //登录失败
                      app.欢迎页验证码()
                      app.welcome.progress2=false;
                      var 错误提示=内容.match(/<p class="(error|success)">(.+)<\/p>/gi)[0].replace(/<.?p.?(class=".+")?>/gi,"");
                      if (错误提示.match("账号")) {
                        app.welcome.账号验证消息=错误提示;
                        app.welcome.账号验证=true;
                      }
                      if (错误提示.match("密码")) {
                        app.welcome.密码验证消息=错误提示;
                        app.welcome.密码验证=true;
                        app.welcome.重复密码验证消息=错误提示;
                        app.welcome.重复密码验证=true;
                      }
                      if (错误提示.match("验证码")) {
                        app.welcome.验证码验证消息=错误提示;
                        app.welcome.验证码验证=true;
                      }
                    }
                  } else {
                    app.欢迎页验证码()
                    var 错误提示='无法连接，请检查网络及之前输入的域码是否正确。E:'+状态码;
                    app.welcome.progress2=false;
                    app.welcome.账号验证消息=错误提示;
                    app.welcome.账号验证=true;
                    app.welcome.密码验证消息=错误提示;
                    app.welcome.密码验证=true;
                    app.welcome.重复密码验证消息=错误提示;
                    app.welcome.重复密码验证=true;
                    app.welcome.验证码验证消息=错误提示;
                    app.welcome.验证码验证=true;
                  }
                },
                超时:function() {
                  //function，在请求超时时调用
                }
              })
            }
            退出登录()
          }
        } else if (this.welcome.是否注册==true) {
          var error=false;
          this.welcome.账号验证=false;
          this.welcome.密码验证=false;
          this.welcome.重复密码验证=false;
          this.welcome.验证码验证=false;
          if (this.welcome.账号=="") {
            error=true;
            this.welcome.账号验证消息="账号不能为空";
            this.welcome.账号验证=true;
          }
          if (this.welcome.密码=="") {
            error=true;
            this.welcome.密码验证消息="密码不能为空";
            this.welcome.密码验证=true;
          }
          if (this.welcome.重复密码!=this.welcome.密码) {
            error=true;
            this.welcome.重复密码验证消息="两次密码不一致";
            this.welcome.重复密码验证=true;
          }
          if (this.welcome.重复密码=="") {
            error=true;
            this.welcome.重复密码验证消息="重复密码不能为空";
            this.welcome.重复密码验证=true;
          }
          if (this.welcome.验证码=="") {
            error=true;
            this.welcome.验证码验证消息="验证码不能为空";
            this.welcome.验证码验证=true;
          }
          if (error!=true) {
            this.welcome.progress2=true;
            //callApp("欢迎页账号","",JSON.stringify(["欢迎页账号回调","注册",this.welcome.账号,this.welcome.密码,this.welcome.验证码]));
          }
        }
      },
      欢迎页验证码:function() {
        this.welcome.验证码图片="img/verImgLoading.svg";
        请求({
          方法:"POST",//string，GET或POST
          地址:this.config.域码+"tool/getVerify/",//string，链接地址（绝对或相对）
          异步:true,//Boolean，是否启用异步
          数据:"",//string，向服务器发送的数据（仅用于post请求）
          发送前:function(xhr,参数) {
            //function，在配置完成后，发送请求前调用
            xhr.responseType = "blob";
          },
          完成后:function(是否成功,状态码,内容,xhr) {
            //function，在请求完成后调用
            if (是否成功) {
              app.域码验证(xhr.responseURL);
              app.welcome.验证码图片=window.URL.createObjectURL(内容);
            } else {
              app.welcome.验证码图片="img/verImgLoadFail.svg";
            }
          },
          超时:function() {
            //function，在请求超时时调用
            app.welcome.验证码图片="img/verImgLoadFail.svg";
            app.$q.notify({
              message: '连接超时，请检查网络连接',
              icon: 'error',
              color:"negative"
            });
          }
        });
      },
      欢迎页启动密码:function() {
        if (this.welcome.启动密码!="") {
          this.welcome.启动密码验证=false;
          this.welcome.progress3=true;
          //callApp("欢迎页设置启动密码","",JSON.stringify(["欢迎页设置启动密码回调",this.welcome.启动密码]));
          this.config.启动密码=this.welcome.启动密码;
          this.config.完成=true;
          if (this.保存配置()) {
            app.$q.notify({
              message: '设置成功',
              icon: 'check_circle',
              color:"primary"
            });
            setTimeout(function() {
              app.welcome.progress3=false;
              app.welcome.done3 = true;
              app.page = "main";
              app.pages.welcome=false;
            },2000);
          } else {
            app.welcome.progress3=false;
            app.welcome.启动密码验证消息='设置失败，请重试或联系开发者';
            app.welcome.启动密码验证=true;
          }
        } else {
          this.welcome.启动密码验证消息='启动密码不能为空';
          this.welcome.启动密码验证=true;
        }
      },
      切换页面回调:function() {
        this.pages[this.page]=true;
      },
      解锁:function() {
        var error=false;
        this.passwd.验证=false;
        if (this.passwd.密码=="") {
          error=true;
          this.passwd.验证消息="密码不能为空";
          this.passwd.验证=true;
        }
        if (error!=true) {
          this.passwd.加载=true;
          //callApp("解锁","解锁回调",JSON.stringify([this.passwd.密码]));
          if (this.passwd.密码==this.config.启动密码) {
            app.$q.notify({
              message: '解锁成功',
              icon: 'check_circle',
              color:"autoLight"
            })
            setTimeout(function() {
              app.passwd.加载=false;
              app.page = "main";
              app.pages.passwd=false;
            },2000)
          } else {
            app.passwd.加载=false;
            app.passwd.验证消息="密码错误";
            app.passwd.验证=true;
          }
        }
      },
      加载阅读界面:function() {
        console.log(666);
      },
      切换页面结束:function() {
        var 回调={
          read:function() {
            console.log("进入阅读页");
            // 初始化turn.js
            /*$('.flipbook').turn({
              // 宽度
              width:$(".flipbook-viewport").width(),
              // 高度
              height:$(".flipbook-viewport").height(),
              // Elevation
              //elevation: 50,
              // Enable gradients
              gradients: true,
              // 切换单页显示
              display: "single",
              // 自动居中
              autoCenter: true,
              when: {
                start: function(event, pageObject, corner) {
                  document.getElementsByClassName("page p-temporal")[0].innerHTML=event.target.parentNode.innerHTML;
                  document.getElementsByClassName("page p-temporal")[0].firstChild.firstChild.style.transform="rotate3d(0, 1, 0, 180deg)";
                  document.getElementsByClassName("page p-temporal")[0].firstChild.firstChild.style.opacity="0.4";
                },
                first: function(event) {
                  document.getElementById("read_disableDrawer").style.visibility="visible";
                  /*app.$q.loading.show({
                    message: '加载中'
                  });
                  if (app.read.lastChapter_code=="无") {
                    app.$q.notify({
                      message: '啊哦，没有上一章',
                      icon: 'error',
                      color:"negative"
                    })
                  } else {
                    app.read.type="last";
                    setTimeout(callApp,200,"开始阅读", "",JSON.stringify([app.read.book_code,app.read.lastChapter_code]));
                  }*/
            /*    },
                last: function(event) {
                  document.getElementById("read_disableDrawer").style.visibility="visible";
                  app.$q.loading.show({
                    message: '加载中'
                  });
                  if (app.read.lastChapter_code=="无") {
                    app.$q.notify({
                      message: '啊哦，没有下一章',
                      icon: 'error',
                      color:"negative"
                    })
                  } else {
                    app.read.type="next";
                    setTimeout(callApp,200,"开始阅读", "",JSON.stringify([app.read.book_code,app.read.nextChapter_code]));
                  }
                },
                turning: function(event, page, view) {
                  document.getElementById("read_disableDrawer").style.visibility="hidden";
                }
              }
            });*/
            //app.read.type="first";
            //刷新翻页阅读页UI(app.read.参数);
          },
          passwd:function() {
            console.log("进入密码页");
          },
          main:function() {
            console.log("进入主页");
            document.getElementById("read_disableDrawer").style.visibility="hidden";
            请求({
              方法:"POST",//string，GET或POST
              地址:app.config.域码+"bookcase/",//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"",//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                app.登录验证(xhr.responseURL);
                var books=内容.match(/<table class='bookone' id=\d+>[\s\S]+?<\/table>/gi);
                var 书架内容=[];
                var 序号=0;
                for (i in books)  // x 为属性名
                {
                  书架内容[序号]={};
                  var 书签=books[i].match(/(?<='case_shuqian'>).+?(?=<\/td>)/gi)[0];
                  if (书签=="书签：无书签") {
                    书架内容[序号].chapter_code="无";
                    书架内容[序号].chapter_name="还未开始阅读";
                  } else {
                    书架内容[序号].chapter_code=书签.match(/(?<=\/)\d+?(?=.html)/gi)[0];
                    书架内容[序号].chapter_name="最近阅读:".concat(书签.match(/(?<=>).+?(?=<)/gi)[0]);
                  }
                  书架内容[序号].book_code=books[i].match(/(?<=id=)\d+?(?=>)/gi)[0];
                  书架内容[序号].book_title=books[i].match(/(?<=case_name.+?html\'>).+?(?=<)/gi)[0];
                  书架内容[序号].loading=true;
                  书架内容[序号].id=序号;
                  序号++;
                }
                if (书架内容.length==0) {
                  app.isBookshelfNull=true;
                } else {
                  //console.log(参数);
                  app.isBookshelfNull=false;
                  app.bookshelf.splice(0,app.bookshelf.length);
                  for (var index in 书架内容) {
                    if (书架内容.hasOwnProperty(index)) {
                      if (typeof 书架内容[index]=="object") {
                        app.bookshelf.push(书架内容[index]);
                      }
                    }
                  }
                }
              },
              超时:function() {
                //function，在请求超时时调用
                app.$q.notify({
                  message: '连接超时，请检查网络连接',
                  icon: 'error',
                  color:"negative"
                })
              }
            });
          },
          welcome:function() {
            console.log("进入欢迎页");
          }
        };
        document.getElementById("read_disableDrawer").style.visibility="visible";
        回调[this.page]();
      },
      阅读菜单:function() {
        this.read.nav=!this.read.nav;
      },
      关闭阅读菜单:function() {
        this.read.nav=!this.read.nav;
      },
      关闭阅读提示:function() {
        callApp("关闭阅读提示","关闭阅读提示回调",JSON.stringify([]));
        关闭阅读提示回调();
      },
      加载章节代码:function() {
        this.阅读.章节代码加载=true;
      },
      加载上一章:function() {
        return new Promise(resolve => {
          setTimeout(() => {
            var book={
              book_code:app.滑动阅读[0].book_code,
              chapter_code:app.滑动阅读[0].lastChapter_code
            }
            请求({
              方法:"POST",//string，GET或POST
              地址:app.config.域码+"api/chapter/",//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"aid="+book.book_code+"&cid="+book.chapter_code,//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
                xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                app.登录验证(xhr.responseURL);
                var data=JSON.parse(内容);
                var 章节内容={};
                章节内容.book_code=book.book_code;
                if (data.status==1) {
                  if (data.page.next=="") {
                    章节内容.nextChapter_code="无";
                  } else {
                    章节内容.nextChapter_code=data.page.next.replace("/","");
                  }
                  if (data.page.prev=="") {
                    章节内容.lastChapter_code="无";
                  } else {
                    章节内容.lastChapter_code=data.page.prev.replace("/","");
                  }
                  章节内容.inner=secret(data.data, data.key, true).replace(/<p><\/p>/gi,"").match(/(?<=<p>).+?(?=<\/p>)/gi);
                  请求({
                    方法:"POST",//string，GET或POST
                    地址:app.config.域码+"novel/"+book.book_code+"/"+book.chapter_code+".html",//string，链接地址（绝对或相对）
                    异步:true,//Boolean，是否启用异步
                    数据:"",//string，向服务器发送的数据（仅用于post请求）
                    发送前:function(xhr,参数) {
                      //function，在配置完成后，发送请求前调用
                      xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
                    },
                    完成后:function(是否成功,状态码,内容,xhr) {
                      //function，在请求完成后调用
                      app.域码验证(xhr.responseURL);
                      app.登录验证(xhr.responseURL);
                      章节内容.chapter_name=内容.match(/(?<=<title>).+?(?=_)/gi)[0];
                      app.滑动阅读.unshift(章节内容);
                      resolve();
                    },
                    超时:function() {
                      //function，在请求超时时调用
                      app.$q.notify({
                        message: '连接超时，请检查网络连接',
                        icon: 'error',
                        color:"negative"
                      });
                    }
                  });
                } else {
                  app.$q.notify({
                    message: '章节不存在',
                    icon: 'error',
                    color:"negative"
                  });
                }
              },
              超时:function() {
                //function，在请求超时时调用
                app.$q.notify({
                  message: '连接超时，请检查网络连接',
                  icon: 'error',
                  color:"negative"
                });
              }
            });
          }, 200);
        });
      },
      加载下一章:function() {
        return new Promise(resolve => {
          setTimeout(() => {
            var book={
              book_code:app.滑动阅读[app.滑动阅读.length-1].book_code,
              chapter_code:app.滑动阅读[app.滑动阅读.length-1].nextChapter_code
            }
            请求({
              方法:"POST",//string，GET或POST
              地址:app.config.域码+"api/chapter/",//string，链接地址（绝对或相对）
              异步:true,//Boolean，是否启用异步
              数据:"aid="+book.book_code+"&cid="+book.chapter_code,//string，向服务器发送的数据（仅用于post请求）
              发送前:function(xhr,参数) {
                //function，在配置完成后，发送请求前调用
                xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
              },
              完成后:function(是否成功,状态码,内容,xhr) {
                //function，在请求完成后调用
                app.域码验证(xhr.responseURL);
                app.登录验证(xhr.responseURL);
                var data=JSON.parse(内容);
                var 章节内容={};
                章节内容.book_code=book.book_code;
                if (data.status==1) {
                  if (data.page.next=="") {
                    章节内容.nextChapter_code="无";
                  } else {
                    章节内容.nextChapter_code=data.page.next.replace("/","");
                  }
                  if (data.page.prev=="") {
                    章节内容.lastChapter_code="无";
                  } else {
                    章节内容.lastChapter_code=data.page.prev.replace("/","");
                  }
                  章节内容.inner=secret(data.data, data.key, true).replace(/<p><\/p>/gi,"").match(/(?<=<p>).+?(?=<\/p>)/gi);
                  请求({
                    方法:"POST",//string，GET或POST
                    地址:app.config.域码+"novel/"+book.book_code+"/"+book.chapter_code+".html",//string，链接地址（绝对或相对）
                    异步:true,//Boolean，是否启用异步
                    数据:"",//string，向服务器发送的数据（仅用于post请求）
                    发送前:function(xhr,参数) {
                      //function，在配置完成后，发送请求前调用
                      xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
                    },
                    完成后:function(是否成功,状态码,内容,xhr) {
                      //function，在请求完成后调用
                      app.域码验证(xhr.responseURL);
                      app.登录验证(xhr.responseURL);
                      章节内容.chapter_name=内容.match(/(?<=<title>).+?(?=_)/gi)[0];
                      app.滑动阅读.push(章节内容);
                      resolve();
                    },
                    超时:function() {
                      //function，在请求超时时调用
                      app.$q.notify({
                        message: '连接超时，请检查网络连接',
                        icon: 'error',
                        color:"negative"
                      });
                    }
                  });
                } else {
                  app.$q.notify({
                    message: '章节不存在',
                    icon: 'error',
                    color:"negative"
                  });
                }
              },
              超时:function() {
                //function，在请求超时时调用
                app.$q.notify({
                  message: '连接超时，请检查网络连接',
                  icon: 'error',
                  color:"negative"
                });
              }
            });
          }, 200);
        });
      },
      加载书架UI:function() {
        setTimeout(function() {
          document.getElementById("bookshelf_content").getElementsByClassName("ivu-scroll-container")[0].style.height=document.getElementById("bookshelf_content").clientHeight+"px";
          if (app.isBookshelfNull) {
            document.getElementById("bookshelf_content").getElementsByClassName("bookshelfTip")[0].style.height=document.getElementById("bookshelf_content").clientHeight-19+"px";
          } else {
            document.getElementById("bookshelf_content").getElementsByClassName("bookshelfContent")[0].style.minHeight=document.getElementById("bookshelf_content").clientHeight-19+"px";
          }
        },500)
        return 400
      },
      加载发现UI:function() {
        setTimeout(function() {
          document.getElementById("find_content").getElementsByClassName("ivu-scroll-container")[0].style.height=document.getElementById("find_content").clientHeight+"px";
          document.getElementById("find_content").getElementsByClassName("findContent")[0].style.minHeight=document.getElementById("find_content").clientHeight-19+"px";
        },500)
        return 400
      },
      加载滑动UI: function() {
        var eventNames={
          bookshelf:"加载书架UI",
          find:"加载发现UI"
        };
        app[eventNames[this.tab]]()
      },
      加载滑动阅读UI:function() {
        setTimeout(function() {
          document.getElementById("slidePage").getElementsByClassName("ivu-scroll-container")[0].style.height=document.getElementById("slidePage").clientHeight+"px";
          document.getElementById("slidePage").getElementsByClassName("readContent")[0].style.minHeight=document.getElementById("slidePage").clientHeight-19+"px";
        },500)
        return 400
      },
      开始阅读:function(book) {
        //document.getElementById("read_disableDrawer").style.visibility="visible";
        //app.$q.loading.show({
        //  message: '加载中'
        //});
        //setTimeout(callApp,1000,"开始阅读", "",JSON.stringify([book.book_code,book.chapter_code]));
        if (book.chapter_code!="无") {
          app.$set(book,'readloading',true);
          请求({
            方法:"POST",//string，GET或POST
            地址:app.config.域码+"api/chapter/",//string，链接地址（绝对或相对）
            异步:true,//Boolean，是否启用异步
            数据:"aid="+book.book_code+"&cid="+book.chapter_code,//string，向服务器发送的数据（仅用于post请求）
            发送前:function(xhr,参数) {
              //function，在配置完成后，发送请求前调用
              xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
            },
            完成后:function(是否成功,状态码,内容,xhr) {
              //function，在请求完成后调用
              app.域码验证(xhr.responseURL);
              app.登录验证(xhr.responseURL);
              var data=JSON.parse(内容);
              var 章节内容={};
              章节内容.book_code=book.book_code;
              if (data.status==1) {
                if (data.page.next=="") {
                  章节内容.nextChapter_code="无";
                } else {
                  章节内容.nextChapter_code=data.page.next.replace("/","");
                }
                if (data.page.prev=="") {
                  章节内容.lastChapter_code="无";
                } else {
                  章节内容.lastChapter_code=data.page.prev.replace("/","");
                }
                章节内容.inner=secret(data.data, data.key, true).replace(/<p><\/p>/gi,"").match(/(?<=<p>).+?(?=<\/p>)/gi);
                请求({
                  方法:"POST",//string，GET或POST
                  地址:app.config.域码+"novel/"+book.book_code+"/"+book.chapter_code+".html",//string，链接地址（绝对或相对）
                  异步:true,//Boolean，是否启用异步
                  数据:"",//string，向服务器发送的数据（仅用于post请求）
                  发送前:function(xhr,参数) {
                    //function，在配置完成后，发送请求前调用
                    xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
                  },
                  完成后:function(是否成功,状态码,内容,xhr) {
                    //function，在请求完成后调用
                    app.域码验证(xhr.responseURL);
                    app.登录验证(xhr.responseURL);
                    章节内容.chapter_name=内容.match(/(?<=<title>).+?(?=_)/gi)[0];
                    app.滑动阅读.splice(0,app.滑动阅读.length);
                    app.滑动阅读.push(章节内容);
                    app.page = "read";
                    app.pages.main=false;
                  },
                  超时:function() {
                    //function，在请求超时时调用
                    app.$q.notify({
                      message: '连接超时，请检查网络连接',
                      icon: 'error',
                      color:"negative"
                    });
                  }
                });
              } else {
                app.$q.notify({
                  message: '章节不存在',
                  icon: 'error',
                  color:"negative"
                });
              }
            },
            超时:function() {
              //function，在请求超时时调用
              app.$q.notify({
                message: '连接超时，请检查网络连接',
                icon: 'error',
                color:"negative"
              });
            }
          });
        } else {
          this.阅读验证码();
          this.阅读.book=book;
          this.阅读.验证码=true;
        }
      },
      阅读验证码:function() {
        this.阅读.验证码图片="img/verImgLoading.svg";
        请求({
          方法:"POST",//string，GET或POST
          地址:this.config.域码+"tool/getVerify/",//string，链接地址（绝对或相对）
          异步:true,//Boolean，是否启用异步
          数据:"",//string，向服务器发送的数据（仅用于post请求）
          发送前:function(xhr,参数) {
            //function，在配置完成后，发送请求前调用
            xhr.responseType = "blob";
          },
          完成后:function(是否成功,状态码,内容,xhr) {
            //function，在请求完成后调用
            if (是否成功) {
              app.域码验证(xhr.responseURL);
              app.阅读.验证码图片=window.URL.createObjectURL(内容);
            } else {
              app.阅读.验证码图片="img/verImgLoadFail.svg";
            }
          },
          超时:function() {
            //function，在请求超时时调用
            app.阅读.验证码图片="img/verImgLoadFail.svg";
            app.$q.notify({
              message: '连接超时，请检查网络连接',
              icon: 'error',
              color:"negative"
            });
          }
        });
      },
      退出阅读页:function() {
        退出阅读页();
      },
      退出APP:function() {
        APP.quit();
        callApp('exit_to_app','','{}');
      },
      保存配置:function() {
        localStorage.config=JSON.stringify(this.config);
        if (localStorage.config) {
          sConfig=localStorage.config;
        } else {
          sConfig="{}";
        }
        var 保存验证=true;
        for (属性 in JSON.parse(sConfig)) {
          if (this.config[属性]!=JSON.parse(sConfig)[属性]) {
            保存验证=flase;
          }
        }
        for (属性 in this.config) {
          if (this.config[属性]!=JSON.parse(sConfig)[属性]) {
            保存验证=flase;
          }
        }
        if (保存验证) {
          return true
        } else {
          return false
        }
      },
      域码验证:function(url) {
        if (url.match(/http(s)?:\/\/.+?\//gi)) {
          if (this.config.域码!=url.match(/http(s)?:\/\/.+?\//gi)[0]) {
            this.config.域码=url.match(/http(s)?:\/\/.+?\//gi)[0];
            this.保存配置();
          }
        }
      },
      登录验证:function(url) {
        if (url.match("login")) {
          this.$q.notify({
            message: '登录信息失效，请重新登录',
            icon: 'error',
            color:"negative"
          })
          this.welcome.code=加密(this.config.域码);
          this.welcome.启动密码=this.config.启动密码;
          this.welcome.账号=this.config.小屋账号;
          this.welcome.密码=this.config.小屋密码;
          this.page="welcome";
          this.pages.main=false;
          this.pages.passwd=false;
          this.startStepper();
          this.欢迎页验证域码();
        }
      }
    }
  }
);
//初始化侧滑栏
var inst = new mdui.Drawer("#drawer",{
  swipe:true
});
app.drawer=inst;
//判断是否为electron应用环境并引入electronAPI
try {
  var APP=require('electron').remote.app;
  app.isEAPP=true;
  app.app_name=APP.getName();
  app.app_version=APP.getVersion()+"-e-"+app.htmlVer;
} catch(e) {
  app.isEAPP=false;
}
//读取配置
if (localStorage.config) {
  sConfig=localStorage.config;
} else {
  sConfig="{}";
}
if (JSON.parse(sConfig).完成==true) {
  app.config=JSON.parse(sConfig);
} else {
  app.page="welcome";
  app.pages.main=false;
  app.pages.passwd=false;
  app.startStepper();
}
//字符串加解密
function 加密(str) {  //加密字符串
  return btoa(pako.gzip(encodeURIComponent(sjcl.encrypt(new Date().toDateString()+"emmm8848", str)), {to: 'string'}));
}
function 解密(str) {
  return sjcl.decrypt(new Date().toDateString()+"emmm8848", decodeURIComponent(String.fromCharCode.apply(null, new Uint16Array(
    pako.inflate(new Uint8Array(atob(str).split('').map(function (x) {
      return x.charCodeAt(0);
    })))
  ))));
}
//网络请求函数
function 请求(参数) {
  /*
  参数实例
  {
    方法:"GET",//string，GET或POST
    地址:"https://baidu.com",//string，链接地址（绝对或相对）
    异步:true,//Boolean，是否启用异步
    数据:"k1=v1&k2=v2",//string，向服务器发送的数据（仅用于post请求）
    发送前:function(xhr,参数) {
      //function，在配置完成后，发送请求前调用
    },
    完成后:function(是否成功,状态码,内容,xhr) {
      //function，在请求完成后调用
    },
    超时:function() {
      //function，在请求超时时调用
    }
  }
  */

  //初始化xhr对象
  var xhr;
  if (window.XMLHttpRequest)
  {
    //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
    xhr=new XMLHttpRequest();
  }
  else
  {
    // IE6, IE5 浏览器执行代码
    xhr=new ActiveXObject("Microsoft.XMLHTTP");
  }

  //设置超时时间及超时时间
  xhr.timeout=15*1000;
  xhr.ontimeout=function() {
    xhr.timeout=0;
    参数.超时()
  }

  if (参数.异步) {
    //规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数
    xhr.onreadystatechange=function()
    {
      if (xhr.readyState==4)
      {
        setTimeout(function(xhr) {
          if (xhr.timeout==0) {
            参数.完成后(xhr.status==200,"Timeout",xhr.response,xhr);
          } else {
            参数.完成后(xhr.status==200,xhr.status,xhr.response,xhr);
          }
        },100,xhr);
      }
    }
  }

  //规定请求的类型、URL 以及是否异步处理请求
  xhr.open(参数.方法,参数.地址,参数.异步);

  if (参数.方法=="POST") {
    //设置HTTP头为 HTML 表单
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  }

  //执行发送前回调
  参数.发送前(xhr,参数);

  //将请求发送到服务器。
  xhr.send(参数.数据);

  if (!参数.异步) {
    //在非异步请求完成后调用回调
    参数.完成后(xhr.status==200,xhr.status,xhr.response,xhr);
  }
}
//小屋数据解密
function secret(a,b,c) {
  b=CryptoJS.MD5(b).toString();
  var d=CryptoJS.enc.Utf8.parse(b.substring(0,16));
  var e=CryptoJS.enc.Utf8.parse(b.substring(16));
  if(c) {
    return CryptoJS.AES.decrypt(a,e,{iv:d,padding:CryptoJS.pad.Pkcs7}).toString(CryptoJS.enc.Utf8)
  }
  return CryptoJS.AES.encrypt(a,e,{iv:d,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7}).toString()
}
//字符串2逻辑值
function s2b(内容) {
  var a={
    true: true,
    false: false
  };
  return a[内容];
}
//接受lua数据操控
function setData(data) {
  function 替换(旧数据,新数据) {
    for (var index in 新数据){
      if ((typeof 新数据[index]=="object")==true) {
        if ((typeof 旧数据[index]=="object")!=true) {
          if (Array.isArray(新数据[index])==true) {
            旧数据[index]=[];
          } else {
            旧数据[index]={};
          }
        }
        替换(旧数据[index],新数据[index]);
      } else {
        旧数据[index] = 新数据[index];
      }
    }
  }
  替换(app,data);
}
//设置深色模式
function setDark() {
  if (app.dark) {
    //Quasar.plugins.Dark.set(false);
    app.dark = false;
  } else {
    //Quasar.plugins.Dark.set(true);
    app.dark = true;
  }
  刷新UI([])
}
function 刷新UI(参数) {
  function 设置主题(参数) {
    document.body.style="--e-depth:3px;--e-back:"+参数.back+";--e-face:"+参数.face+";--e-light:"+参数.light+";--e-dark:"+参数.dark;
  }
  var 主题={
    浅色:{
      默认:{
        back:"#E3EDF7",
        face:"#31456A",
        light:"#FFFFFF",
        dark:"rgba(136, 165, 191, 0.48)"
      },
      小屋绿:{
        back:"#d8eee5",
        face:"#328f6f",
        light:"#eefffc",
        dark:"#c2d6ce"
      },
      OTAKOYI白:{
        back:"#ecf0f3",
        face:"#bfc1c3",
        light:"#fff",
        dark:"#d1d9e6"
      },
      arielone橙:{
        back:"#f6f5f0",
        face:"#ff4500",
        light:"#fff",
        dark:"#d1d0cc"
      },
      arielone黄:{
        back:"#f6f5f0",
        face:"#626260",
        light:"#fff",
        dark:"#d1d0cc"
      },
      emysk蓝:{
        back:"#ebecf0",
        face:"#1A61F3",
        light:"#fff",
        dark:"#c8c9cc"
      }
    },
    深色:{
      默认:{
        back:"#26282C",
        face:"#d6e1ef",
        light:"rgba(255, 255, 255, 0.12)",
        dark:"rgba(6, 8, 9, 0.46)"
      },
      kedavra灰:{
        back:"#31363b",
        face:"#C0C1C2",
        light:"#4e565e",
        dark:"#141618"
      },
      kedavra橙:{
        back:"#31363b",
        face:"#E04111",
        light:"#4e565e",
        dark:"#141618"
      }
    }
  }
  if (参数[0]=="自定义") {
    //自定义配色
  } else {
    if (app.dark) {
      var 色调="深色";
    } else {
      var 色调="浅色";
    }
    if (主题[色调].hasOwnProperty(参数[0])) {
      if (typeof 主题[色调][参数[0]]=="object") {
        设置主题(主题[色调][参数[0]]);
      }
    } else {
      if (typeof 主题[色调][app.defaultTheme[色调]]=="object") {
        设置主题(主题[色调][app.defaultTheme[色调]]);
      } else {
        设置主题(主题[色调]["默认"]);
      }
    }
  }
}
function 刷新书架回调(参数) {
  书架回调(参数);
  app.结束刷新书架动画();
}
function 书架回调(参数) {
  if (参数[0]=="无") {
    app.isBookshelfNull=true;
  } else {
    console.log(参数);
    app.isBookshelfNull=false;
    app.bookshelf.splice(0,app.bookshelf.length);
    for (var index in 参数) {
      if (参数.hasOwnProperty(index)) {
        if (typeof 参数[index]=="object") {
          app.bookshelf.push(参数[index]);
        }
      }
    }
  }
}
/*
function 书籍简介回调(参数) {
  for (var index in app.bookshelf) {
    if (app.bookshelf.hasOwnProperty(index)) {
      if (typeof app.bookshelf[index]=="object") {
        if (app.bookshelf[index].book_code==参数.book_code) {
          app.$set(app.bookshelf[index],'info',参数);
          app.$set(app.bookshelf[index],'loading',false);
        }
      }
    }
  }
}
function 欢迎页验证域码回调(参数) {
  if (参数[0]==true) {
    app.$q.notify({
      message: '连接成功',
      icon: 'check_circle',
      color:"primary"
    })
    setTimeout(function() {
      app.welcome.progress1=false;
      app.welcome.done1 = true;
      app.welcome.step = 2;
      app.welcome.alert=true;
      欢迎页验证码()
    },2000)
  } else {
    app.welcome.progress1=false;
    app.welcome.域码验证消息='连接失败，请检查网络连接及所输入的域码是否正确';
    app.welcome.域码验证=true;
  }
}
function 欢迎页验证码() {
  app.$q.loading.show({
    message: '正在加载验证码'
  });
  setTimeout(callApp,200,"加载验证码", "",JSON.stringify(["欢迎页验证码回调"]));
}
function 欢迎页验证码回调(参数) {
  app.welcome.验证码图片=参数;
  app.$q.loading.hide();
}
function 欢迎页账号回调(参数) {
  if (参数[0]==true) {
    app.$q.notify({
      message: app.welcome.卡片状态+'成功',
      icon: 'check_circle',
      color:"autoLight"
    })
    setTimeout(function() {
      app.welcome.progress2=false;
      app.welcome.done2 = true;
      app.welcome.step = 3;
    },2000)
  } else {
    app.welcome.progress2=false;
    app.welcome.账号验证消息=参数[1];
    app.welcome.账号验证=true;
    app.welcome.密码验证消息=参数[1];
    app.welcome.密码验证=true;
    app.welcome.重复密码验证消息=参数[1];
    app.welcome.重复密码验证=true;
    app.welcome.验证码验证消息=参数[1];
    app.welcome.验证码验证=true;
  }
}
function 欢迎页设置启动密码回调(参数) {
  if (参数[0]==true) {
    app.$q.notify({
      message: '设置成功',
      icon: 'check_circle',
      color:"primary"
    });
    callApp("获取书架", "","{}");
    setTimeout(function() {
      app.welcome.progress3=false;
      app.welcome.done3 = true;
      app.page = "main";
      app.pages.welcome=false;
    },2000);
  } else {
    app.welcome.progress3=false;
    app.welcome.启动密码验证消息='设置失败，请重试或联系开发者';
    app.welcome.启动密码验证=true;
  }
}
function 解锁回调(参数) {
  if (参数[0]==true) {
    app.$q.notify({
      message: '解锁成功',
      icon: 'check_circle',
      color:"autoLight"
    })
    setTimeout(function() {
      app.passwd.加载=false;
      app.page = "main";
      app.pages.passwd=false;
    },2000)
  } else {
    app.passwd.加载=false;
    app.passwd.验证消息="密码错误";
    app.passwd.验证=true;
  }
}
*/
function 阅读回调(参数) {
  setTimeout(function() {
    app.page = "read";
    app.pages.main=false;
  },2000)
}
/*
function 初次使用() {
  app.page="welcome";
  app.pages.main=false;
  app.pages.passwd=false;
  app.startStepper();
}
*/
function 关闭阅读提示回调() {
  app.read.first=false;
}
function 开始阅读回调(参数) {
  if (app.pages.read) {
    刷新翻页阅读页UI(参数);
  } else {
    app.page = "read";
    app.pages.main=false;
    app.read.参数=参数;
  }
  //console.log(JSON.stringify(参数));
}
function 刷新翻页阅读页UI(参数,结果) {
  document.getElementById("read_disableDrawer").style.visibility="visible";
  var func={
    first:function() {
      app.read.lastChapter_code=参数.lastChapter_code;
      app.read.nextChapter_code=参数.nextChapter_code;
      app.read.book_code=参数.book_code;
      app.read.pageToRemove=0;
      app.read.pageToJump=2;
    },
    last:function() {
      app.read.lastChapter_code=参数.lastChapter_code;
    },
    next:function() {
      app.read.nextChapter_code=参数.nextChapter_code;
      app.read.pageToRemove=JSON.parse(JSON.stringify([$(".flipbook").turn("pages")]))[0];
      app.read.pageToJump=JSON.parse(JSON.stringify([$(".flipbook").turn("pages")]))[0];
    }
  }
  func[app.read.type]();
  if (参数.hasTitle) {
    app.read.testPage.book_title=参数.book_title;
    app.read.testPage.chapter_name=参数.chapter_name;
    app.read.testPage.hasTitle=true;
    结果=[];
  }
  app.read.testPage.inner.splice(0,app.read.testPage.inner.length);
  setTimeout(刷新翻页阅读页UI_循环,1,参数,结果);
}
function 刷新翻页阅读页UI_循环(参数,结果) {
  if (document.getElementsByClassName("testPage")[0].getElementsByClassName("page_content")[0].clientHeight>document.getElementsByClassName("testPage")[0].getElementsByClassName("flipReadPage_content")[0].clientHeight) {
    参数.chapter_inner.unshift(app.read.testPage.inner.pop());
    参数.hasTitle=false;
    结果.push(JSON.parse(JSON.stringify(app.read.testPage)));
    app.read.testPage.hasTitle=false;
    刷新翻页阅读页UI(参数,结果);
  } else {
    if (参数.chapter_inner[0]) {
      app.read.testPage.inner.push(参数.chapter_inner[0]);
      参数.chapter_inner.shift();
      setTimeout(刷新翻页阅读页UI_循环,1,参数,结果);
    } else {
      app.read.realPages.splice(0,app.read.realPages.length);
      for (var index in 结果) {
        if (结果.hasOwnProperty(index)) {
          if (typeof 结果[index]=="object") {
            app.read.realPages.push(结果[index]);
          }
        }
      }
      setTimeout(刷新翻页阅读页UI_插入,1);
    }
  }
}
function 刷新翻页阅读页UI_插入() {
  var Pages=document.getElementsByClassName("realPage");
  if (app.read.type=="last") {
    setTimeout(刷新翻页阅读页UI_插入_循环,1,Pages,0,JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0],0);
  } else {
    setTimeout(刷新翻页阅读页UI_插入_循环,1,Pages,0,JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0],JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0]);
  }
}
function 刷新翻页阅读页UI_插入_循环(Pages,index,index_a,index_p) {
  if (Pages.hasOwnProperty(index)) {
    console.log(index);
    console.log(index_p);
    console.log(index_a);
    //$(".flipbook").turn("pages", index_a+1);
    $(".flipbook").turn("addPage",$("<div />").html(Pages[index].innerHTML.replace(/&amp;/gi,"&")), index_p+1);
    if (app.read.type=="last") {
      setTimeout(刷新翻页阅读页UI_插入_循环,1,Pages,index+1,JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0],0);
    } else {
      setTimeout(刷新翻页阅读页UI_插入_循环,1,Pages,index+1,JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0],JSON.parse(JSON.stringify([($(".flipbook").turn("pages"))]))[0]);
    }
  } else {
    //$(".flipbook").turn("pages", index_a+1);
    $(".flipbook").turn("addPage",$("<div />").html('<div class="flipReadPage"><div class="flipReadPage_content"><div class="page_content"><h1>加载中</h1></div></div></div>'), index_p+1);
    if (app.read.type=="last") {
      app.read.pageToRemove=JSON.parse(JSON.stringify([(index+1)]))[0];
      app.read.pageToJump=JSON.parse(JSON.stringify([(index+1)]))[0];
    }
    if (app.read.pageToRemove!=0) {
      $(".flipbook").turn("removePage", app.read.pageToRemove);
    }
    $(".flipbook").turn("page", app.read.pageToJump);
    app.$q.loading.hide()
  }
}
function 退出阅读页() {
  app.page="main";
  app.pages.read=false;
}
刷新UI(["默认"])
//告诉APP加载完成
callApp("onLoad","","{}");
